package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.fastjson.JSON;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.RoleDao;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.pojo.Role;
import com.itheima.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;

@Service(interfaceClass = RoleService.class)
@Transactional
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleDao roleDao;

    /**
     * 分页查询所有的角色
     * @param queryPageBean 分页的条件
     * @return
     */
    @Override
    public PageResult findAll(QueryPageBean queryPageBean) {
        // 开启分页
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());
        //dao查询
        Page<Role> page=roleDao.findAll(queryPageBean.getQueryString());

        return new PageResult(page.getTotal(), page.getResult());
    }

    /**
     * 保存一个角色
     * @param ids 角色拥有的权限的id数组
     * @param role 角色的基本信息
     */
    @Override
    public void saveOne(int[] ids, Role role) {
        //先保存基本信息 ,我要先拿到基本信息的主键,
        roleDao.saveOneBasic(role);
        //然后拿着主键去添加中间表
        HashMap<String, Integer> map = new HashMap<>();
        map.put("role_id", role.getId());
        if (ids!=null && ids.length >0){
            for (int i = 0; i < ids.length; i++) {
                map.put("permission_id", ids[i]);
                roleDao.saveMiddle(map);
            }
        }
    }

    /**
     * 根据id查询对应的角色信息
     * @param id
     * @return
     */
    @Override
    public Role selectBasicById(int id) {
        return roleDao.selectBasicById(id);
    }

    /**
     * 根据角色的id查中间表对应的所有权限的id
     * @param id 角色的主键id
     * @return
     */
    @Override
    public int[] selectMiddleByRoleId(int id) {

        return roleDao.selectMiddleByRoleId(id);
    }

    /**
     * 修改角色信息
     * @param newIds
     * @param role
     */
    @Override
    public void updateOne(int[] newIds, Role role) {

        // 先修改基本信息
        roleDao.updateBasic(role);
        // 操作中间表,先删除这个角色之前对应的所有权限
        roleDao.deleteMiddleIds(role.getId());
        // 再把新的权限ids数组一个个添加进去
        HashMap<String, Integer> map = new HashMap<>();
        map.put("role_id", role.getId());
        for (int i = 0; i < newIds.length; i++) {
            map.put("permission_id", newIds[i]);
            roleDao.saveMiddle(map);
        }

    }

    @Override
    public void deleteRoleById(int id) {
        // 必须先判断这个角色有没有被用户占用
       Long length= roleDao.selectUserByRoleId(id);
       if (length >0){
           throw new RuntimeException("此角色被用户表占用,无法直接删除!");
       }

       //能到这里说明每抛出异常, 没有被用户表占用
        roleDao.deleteMiddleIds(id);  //删中间表
        roleDao.deleteRoleById(id);  // 在删角色表

    }
}
